package chapter09.map;

import java.util.HashMap;

/**
 * 更新映射的几种方法
 * getOrDefault
 * putIfAbsent
 * merge
 * compute
 *
 * @author insight
 * @since 2021/1/28
 */
public class Test02_UpdateMap {
    public static void main(String[] args) {
        var updateTest1 = new HashMap<Integer, Integer>(8);
        /*
         * 注意一下所有方法 如果操作结果value为null
         * 则删除对应key
         */
        /*
         * 如果不存在key则put
         * 否则返回value
         */
        updateTest1.putIfAbsent(1, 1);
        System.out.println(updateTest1);
        /*
         * V compute(K key,
                     BiFunction<? super K, ? super V, ? extends V> remappingFunction)
         * compute是把函数同时应用到key和value
         * 需要注意函数必须能够同时对两种类型进行操作
         * 如果找不到key 会抛出NullPointerException
         */
        updateTest1.compute(1, (k, v) -> v + 1);
        System.out.println(updateTest1);
        //如果不存在 就操作
        updateTest1.computeIfAbsent(1, k -> 1);
        System.out.println(updateTest1);
        //如果key存在 就操作
        updateTest1.computeIfPresent(1, (k, v) -> v + 1);
        System.out.println(updateTest1);

        var updateTest2 = new HashMap<String, Integer>(8);
        updateTest2.put("test0", updateTest2.getOrDefault("test", 1));
        updateTest2.putIfAbsent("test2", 2);
        /*
         * merge只对value起作用
         * 如果key不存在 则关联value
         * 如果存在 就对操作过后的新结果关联
         */
        updateTest2.merge("test3", 3, Integer::sum);
        updateTest2.replaceAll((s, integer) -> integer * 10 + (int)(s.charAt(s.length() - 1) - '0'));
        System.out.println(updateTest2);
    }
}
